package com.situ.mall.common.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.PageHelper;
import com.situ.mall.common.entity.Category;
import com.situ.mall.common.entity.Product;
import com.situ.mall.common.exception.MyException;
import com.situ.mall.common.mapper.CategoryMapper;
import com.situ.mall.common.mapper.ProductMapper;
import com.situ.mall.common.service.ICategoryService;
import com.situ.mall.common.util.StringUtil;
import com.situ.mall.common.vo.CategoryVO;
import com.situ.mall.common.vo.IndexCategoryVO;
import com.situ.mall.common.vo.TableVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * <p>
 * 服务实现类
 * </p>
 *
 * @author JavaWizard
 * @since 2023-09-12
 */
@Service
public class CategoryServiceImpl extends ServiceImpl<CategoryMapper, Category> implements ICategoryService {

    @Autowired
    private ProductMapper productMapper;

/* 后台请求 */
    //发请求去查分类数据
    @Override
    public List<Category> all() {
        return baseMapper.all();
    }

    //查询商品表格
    @Override
    public TableVO tree(Integer page, Integer limit, String name, Integer parentId) {
        //PageHelper 分页小工具
        PageHelper.startPage(page, limit);
        //前台没传name，就是查全部，给ParentId赋值0
        if (StringUtil.isBlank(name)) {
            parentId = 0;
        }
        List<CategoryVO> list = baseMapper.selectByParentId(name, parentId);
        //查这个母菜单所有的子菜单
        load(list);
        return TableVO.data(list);
    }
    private void load(List<CategoryVO> list) {
        //遍历所有查出来的一级菜单，查对应的二级菜单
        for (CategoryVO c : list) {
            //根据一级菜单的ID去查二级菜单
            //查到 c菜单的子菜单list1
            List<CategoryVO> list1 = baseMapper.selectByParentId1(c.getId());
            //如果 list1还有子菜单，就继续查
            if (!list1.isEmpty()) {
                load(list1);
            }
            //把子菜单放到c菜单的children属性里
            c.setChildren(list1);
        }
    }

    //保存 新增保存 or 编辑保存
    @Override
    public void saveCategory(Category category) {
        //判断是否分类名重复
        Category c = baseMapper.selectByName(category.getName(),category.getId());
        //如果根据分类名查到了，说明用户名重复，不能添加用户
        if (c != null) {
            throw new MyException("该分类名已经被使用");
        }
        //如果没传排序码,指定排序码为0，放到里面
        if (category.getSequence() == null || category.getSequence().isEmpty()){
            category.setSequence("0");
        }
        //如果没传状态码，指定状态码为0，放到里面
        if (category.getStatus() == null || category.getStatus().isEmpty()){
            category.setStatus("0");
        }
        //判断是新增还是编辑
        if (category.getId() == null) {
            baseMapper.save(category);//新增保存
        }else {
            //一级分类下架，先判断是否有二级分类，且在上架中
            if (category.getParentId() == 0){
                //如果有下级
                List<CategoryVO> categoryVOS = baseMapper.selectByParentId1(category.getId());
                if (categoryVOS != null){
                    //遍历二级分类，看看有没有在上架的
                    for (CategoryVO vo : categoryVOS){
                        if (vo.getStatus().equals("0")){
                            throw new MyException("该分类下有商品正在上架");
                        }
                    }
                }
            }
            //二级分类下架，先判断是否有商品，且在上架中
            if (category.getParentId() != 0){
                //如果有商品
                List<Product> products = productMapper.selectByCategoryId(category.getId());
                if (products != null){
                    //遍历这些商品，看看有没有在上架的
                    for (Product product : products){
                        if (product.getStatus().equals("0")){
                            throw new MyException("该分类下有商品正在上架");
                        }
                    }
                }
            }
            baseMapper.update(category);//编辑保存
        }
    }

    //删除
    @Override
    public void delete(Integer id) {
        //如果有二级分类，删不了
        List<CategoryVO> list = baseMapper.selectByParentId1(id);
        if (!list.isEmpty()) {
            throw new MyException("此分类有下级分类，无法删除");
        }
        //如果有商品（无论是否上架），删不了
        List<Product> products = productMapper.selectByCategoryId(id);
        if (!products.isEmpty()){
            throw new MyException("此分类包含商品，无法删除");
        }
        baseMapper.delete(id);
    }

    //编辑——根据ID查询该行数据带到前台
    @Override
    public Category selectById(Integer id) {
        return baseMapper.selectById(id);
    }



/* 前端请求 */
    //一打开首页，就查所有分类
    @Override
    public List<IndexCategoryVO> indexList() {
        return baseMapper.indexList();
    }
}
